const pool = require('../db');

class VisitorManager {
    constructor() {
        this.visitors = new Map(); // 存储在线游客信息 name -> info
        this.socketToVisitor = new Map(); // 存储 socket.id -> visitorName 的映射
        this.pendingVisitors = new Map(); // 存储待连接的游客信息
        this.cleanupInterval = setInterval(() => this.cleanupPendingVisitors(), 60000); // 每分钟清理一次
    }

    // 更新访客统计
    async updateVisitorCount() {
        try {
            const today = new Date().toISOString().split('T')[0];

            // 检查今天是否已有记录
            const [existing] = await pool.query(
                'SELECT id FROM daily_visitor_count WHERE date = ?',
                [today]
            );

            if (existing.length > 0) {
                // 更新现有记录
                await pool.query(
                    'UPDATE daily_visitor_count SET visitor_count = visitor_count + 1 WHERE date = ?',
                    [today]
                );
            } else {
                // 创建新记录
                await pool.query(
                    'INSERT INTO daily_visitor_count (date, visitor_count) VALUES (?, 1)',
                    [today]
                );
            }
        } catch (error) {
            console.error('更新访客统计失败:', error);
        }
    }

    // 添加游客（登录时调用，不带socket）
    addVisitorWithoutSocket(name, info) {
        if (this.visitors.has(name) || this.pendingVisitors.has(name)) {
            throw new Error('该昵称已被使用');
        }
        this.pendingVisitors.set(name, {
            info,
            timestamp: Date.now()
        });
    }

    // 添加游客（WebSocket连接时调用）
    async addVisitor(name, info, socketId) {
        // 检查是否是待连接的游客
        const pending = this.pendingVisitors.get(name);
        if (!pending || pending.info.id !== info.id) {
            console.log('无效的游客信息:', name);
            return; // 直接返回，不抛出错误
        }

        this.visitors.set(name, info);
        this.socketToVisitor.set(socketId, name);
        this.pendingVisitors.delete(name); // 移除待连接状态

        // 更新访客统计
        await this.updateVisitorCount();
    }

    // 根据 socket.id 移除游客
    removeVisitorBySocketId(socketId) {
        const visitorName = this.socketToVisitor.get(socketId);
        if (visitorName) {
            this.visitors.delete(visitorName);
            this.socketToVisitor.delete(socketId);
        }
    }

    // 检查名称是否已被使用（包括待连接的游客）
    hasVisitor(name) {
        return this.visitors.has(name) || this.pendingVisitors.has(name);
    }

    // 获取游客信息
    getVisitor(name) {
        return this.visitors.get(name) || this.pendingVisitors.get(name)?.info;
    }

    // 清理超时的待连接游客（5分钟超时）
    cleanupPendingVisitors() {
        const now = Date.now();
        const timeout = 5 * 60 * 1000; // 5分钟

        for (const [name, data] of this.pendingVisitors.entries()) {
            if (now - data.timestamp > timeout) {
                this.pendingVisitors.delete(name);
            }
        }
    }

    // 销毁时清理定时器
    destroy() {
        if (this.cleanupInterval) {
            clearInterval(this.cleanupInterval);
        }
    }
}

// 创建单例
const visitorManager = new VisitorManager();
module.exports = visitorManager; 